#ifndef __BUFFER_H__
#define __BUFFER_H__

#include <vector>
#include <string>
#include <cstring>
#include <unistd.h>
#include <atomic>
#include <algorithm>
#include <cassert>
#include <sys/uio.h>
#include <cerrno>

#define DEFAULT_SIZE 1024

class Buffer
{
public:
    Buffer(size_t initbuffersize = DEFAULT_SIZE);
    ~Buffer();

    size_t ReadAble() const;         // 可以读的长度
    size_t WriteAble() const;        // 可以写的长度
    size_t PrependableBytes() const; // 已读前面的长度

    const char *Peek() const;//返回现在readpos的地址
    void EnsureWriteAble(int len);//确保写入的长度不会使buffer越界
    void HasWritten(int len); //写入后向后挪动wirtepos

    void HasReaded(int len); //读后向后挪动readpos
    void ReadUtil(const char *end); //readpos挪到end处

    void ClearBuffer(); //清空
    std::string ClearBufferToStr(); //清空,将原字符串返回

    const char *BeginWriteConst() const;  //返回开始写的地址
    char *BeginWrite();

    //添加字符串到buffer后
    void Append(const std::string &str);  
    void Append(const char *str, size_t len);
    void Append(const void *data, size_t len);
    void Append(const Buffer &buffer);

    //向fd中读或写
    ssize_t ReadFd(int fd, int* Errno);
    ssize_t WriteFd(int fd, int* Errno);

private:
    //返回字符串首地址
    const char *BeginPtr_() const;
    char *BeginPtr_();

    void MakePlace_(int len);//实现扩容和内部进行移动未读的字符串到首部

private:
    std::atomic<std::size_t> readpos_;
    std::atomic<std::size_t> writepos_;
    std::vector<char> buffer_;
};

#endif